home *** CD-ROM | disk | FTP | other *** search
/ Directorty Opus 5 - Magellan 2 / Opus 5 - Magellan 2.iso / Extras / GCC_ERROR / ARexx / GCC_ERROR.dopus5
Text File  |  1997-03-26  |  27KB  |  1,049 lines

  1. /*
  2. ** File: GCC_Error.dopus5
  3. **
  4. ** Date created:      10.11.1996 Emmy
  5. ** Last modifycation: 27.03.1997 Emmy
  6. **
  7. ** Version: 0.7
  8. **
  9. ** Copyrigth 1996/1997 (c) by Emmy. This is EMAILWARE !
  10. *********************************************************
  11. ** ARexx Script to make DOpus5.5 to an errorlister for GCC V2.7.2.1 & GOLDED 4.x
  12. **
  13. **
  14. ** Requires:
  15. ** ---------
  16. **
  17. **   DOpus 5.5 (Could perhaps also work under 5.11(AMINET SET 4) -- not tested)
  18. **   DOpus MagicWB-Iconset installed (For the errorlister toolbar).
  19. **   GCC 2.7.x (tested with 2.7.0 & 2.7.2.1) & GNU-Tools
  20. **   GoldEd 4
  21. ** 
  22. ** VERY MUCH MEMORY : I`ve got 34 MB memory, and i`ve no problems 
  23. **                    running GCC + DOpus + GoldED at the same time.
  24. **                    If you don`t have so "much" memory, then decrase
  25. **                    the stack-size in DoRemake. (But, 32 MB cost actual 220 DM,
  26. **                    so why not buying some ? 8-)
  27. **
  28. ** Installation:
  29. ** -------------
  30. **
  31. **   Just do:
  32. **
  33. **     1.> CD
  34. **     "Ram Disk:GCC_ERROR"
  35. **     1.> Copy ARexx TO DOpus5:ARexx ALL
  36. **     1.> Copy FileTypes TO DOpus5:FileTypes ALL
  37. **     1.> Copy Buttons TO DOpus5:Buttons ALL
  38. **
  39. **    (You can, of course, also do this with DOpus ...)
  40. **   
  41. ** Modifing the makefile:
  42. ** ----------------------
  43. **
  44. ** Modify your makefile to send all error messages to the errorfile (T:MAKE.ERROROUT).
  45. **
  46. ** (E.g.: /bin/gcc 2>>T:MAKE.ERROROUT -o ...)
  47. **
  48. ** See the suplyed example makefiles.
  49. **
  50. **
  51. ** Manual(Manuel ?) Configuration of the filetype:
  52. ** -----------------------------------------------
  53. **
  54. ** I`ve you don`t want to copy
  55. ** Create a datatype "MakeFile" with DTGr = Text, DTId = ascii and 
  56. ** Comp. Name "#?makefile#?".
  57. ** 
  58. ** Configurate an PopUp-Menue "GNU Make" with this command entry:
  59. **   ARexx : DOpus5:ARexx/gcc_error.dopus5 SERVE {Qp} {s} T:MAKE.ERROROUT 
  60. **
  61. **
  62. ** Future
  63. ** ------
  64. **   - Write a texinfo (->Guide/DVI)
  65. **   - Fix multidirectory bug
  66. **   - Cleanup the code
  67. **   - Your suggestions
  68. **   - Fix some known bugs/missing features (About-Req., Break_Make)
  69. **   - Add support for other GNU-Commands, like Texinfo(makeinfo), etc.
  70. **
  71. ** History
  72. ** -------
  73. **
  74. **  V0.7 (27-03-97)
  75. **    - First release to the Aminet
  76. **
  77. **
  78. ** Copyright Note:
  79. ** ---------------
  80. **
  81. **   This software is subject to the "Standard Amiga FD-Software Copyright Note".
  82. **   It is MAILWARE as defined in paragraph 4.b.
  83. **   For more information please read "AFD-COPYRIGHT" (Version 1 or higher).
  84. **
  85. ** Greetings:
  86. ** ----------
  87. **
  88. **   Greetings flys to:
  89. **
  90. **     FSF              -- For the great GNU-Project !
  91. **     Dietmar Eilert   -- For GoldED (Ja ich weiß, ich registriere mich ja bald ...)
  92. **     Jonathan Potter  -- For the best avaible FileManager on the world. 
  93. **                         (Or do you know a better one ? (Win95 Explorer is just shit
  94. **                         (not configurable ...),  MaxonTools does just not have the 
  95. **                         power of DOpus; RumorOpus !?!? (Nice program, but not so powerfull);
  96. **                         Perhaps OS/2 WPS (but who uses OS/2 ?)
  97. **     Bram Moolenaar   -- For the GREAT VIM (Vi IMprovment). I edit all my rexx-scripts with it.
  98. **                         (Better turn-around times on the shell)
  99. **
  100. **     Stefan Stunz     -- For MUI, the powerfullest GUI System avaible. And for giving me the kick
  101. **                         to program OO (With PSI.c)
  102. **
  103. **     Phase 5          -- For giving us a future (A/Box)
  104. **     ProDAD           -- For giving us AmigaOS NG (pOS)
  105. **
  106. ** Author:
  107. ** -------
  108. **
  109. ** Bug reports, suggestions or everything else are very welcome. 
  110. ** Write to:
  111. **
  112. **         Emmeran "Emmy" Seehuber
  113. **         Krankenhausstr. 6
  114. **         D-83569 Vogtareuth
  115. **
  116. **         Germany
  117. **         EMail: es@mylius.com
  118. **
  119. **   (I prefer EMail)
  120. */
  121.  
  122.  
  123. /*
  124. ** Global Init 
  125. */
  126.  
  127. OPTIONS RESULTS                /* We want results ! */
  128. PARSE ARG sAction sParas
  129.  
  130. portname = 'GCC_ERROR'
  131.  
  132. sAction = STRIP( SUBWORD( sAction, 1, 1 ) )
  133. LF = '0a'x
  134.  
  135. /*
  136. ** Calling Paramters:
  137. **
  138. ** <Action> <Action-Spezifical Paras>
  139. **
  140. ** Actions:
  141. **   SERVE         <DOPUS-PORTNAME> <DIRECTORY_NAME_OF_PROJECT> <NAME_OF_ERRORFILE>
  142. **   GO_NEXT_ERROR
  143. **   GO_FIRST_ERROR
  144. **   REMAKE_PROJECT 
  145. **   REMAKE_PROJECT_NEWDIR <DIRECTORY_NAME_OF_PROJECT>
  146. **   DUMP_ENV  
  147. **   ABOUT
  148. **   BREAK_MAKE              
  149. */
  150.  
  151.  
  152. /* 
  153. ** Messages to be sent to the server
  154. */
  155. sSendActions = "ABOUT REMAKE_PROJECT DUMP_ENV GO_NEXT_ERROR GO_FIRST_ERROR REFRESH_ERRLIST"
  156.  
  157. /*
  158. ** What should be done ?
  159. */
  160.  
  161. SELECT
  162.   WHEN POS( sAction, sSendActions ) > 0 THEN DO
  163.  
  164.     /* 
  165.     ** Send this message to the server
  166.     */
  167.  
  168.     IF SHOW('p','GCC_ERROR') THEN DO
  169.       ADDRESS 'GCC_ERROR'
  170.       sAction sParas /* Send the Action to do */
  171.       EXIT
  172.     END
  173.   END
  174.   WHEN sAction = 'SERVE' THEN DO
  175.     
  176.     /*
  177.     ** Start as server
  178.     */
  179.  
  180.     PARSE ARG sAction DOpusPort sPrjDirName ErrFileName
  181.  
  182.     IF sPrjDirName = "" THEN DO
  183.       ADDRESS "COMMAND" "C:REQUESTCHOICE" "GCC_ERROR" "NO PRJDIR !!!" "_Oh shit !!!"
  184.       EXIT
  185.     END
  186.  
  187.     /* 
  188.     ** LoadLibs
  189.     */
  190.  
  191.     IF ~SHOW('l','rexxsupport.library') THEN
  192.       CALL ADDLIB('rexxsupport.library',0,-30)
  193.  
  194.     /*
  195.     ** SetUp Error Handling
  196.     */
  197.  
  198.     /*
  199.     ** SIGNAL ON FAILURE
  200.     ** SIGNAL ON ERROR
  201.     ** SIGNAL ON HALT
  202.     */
  203.  
  204.     /* 
  205.     ** Are we already running ? 
  206.     */
  207.     IF SHOW('p','GCC_ERROR') THEN DO
  208.       ADDRESS 'GCC_ERROR' 
  209.       REMAKE_PROJECT_NEWDIR sPrjDirName
  210.       EXIT
  211.     END
  212.  
  213.     CALL CacheThisScript
  214.  
  215.     /*
  216.     ** Start the compiler
  217.     */
  218.  
  219.     ErrFileName = STRIP(ErrFileName)
  220.     DoFill = 1
  221.  
  222.     /*
  223.     ** Is there already a ERROR-File to be parsed ? 
  224.     */
  225.  
  226.     IF  Open( Dummy, ErrFileName, 'READ' ) THEN 
  227.       Close( Dummy )
  228.     ELSE DO
  229.       CALL DoRemake /* Make Project */
  230.       DoFill = 0
  231.     END
  232.  
  233.     /* 
  234.     ** Init DOpus Lister 
  235.     */
  236.  
  237.     ADDRESS "DOPUS.1" /* DOpusPort */
  238.     LISTER NEW TOOLBAR GCC_ERROR
  239.     handle = result
  240.     LISTER SET handle LOCK FORMAT ON
  241.     LISTER SET handle SEPARATE MIX
  242.     LISTER SET handle FIELD OFF
  243.     CALL ShowCompilingInProgress
  244.  
  245.     /*
  246.     ** SetUp Port
  247.     */
  248.  
  249.     CALL OpenPort( portname )
  250.     LISTER SET handle HANDLER portname
  251.  
  252.     /*
  253.     ** SetUp Opus Traps
  254.     */
  255.  
  256.     Reject = 'MakeDir Read HexRead Show Play CopyAs Move MoveAs Rename Comment Protect'
  257.     Reject = Reject 'Copy Parent Root ScanDir'
  258.     Traps = 'Delete' Reject
  259.     DO While Traps ~= '' 
  260.       PARSE VAR Traps sCMD Traps
  261.       DOPUS ADDTRAP sCMD portname
  262.     END
  263.  
  264.     /*
  265.     ** Main Programm
  266.     */
  267.  
  268.     IF DoFill = 1 THEN
  269.       CALL ReadErrFile
  270.  
  271.     CALL DoHandle
  272.  
  273.     /*
  274.     ** CleanUp
  275.     */
  276.  
  277.     CALL ClosePort( portname )
  278.     CALL CleanUpFiles
  279.   END /* WHEN sAction = 'SERVE' */
  280.   OTHERWISE
  281.     SAY "Sorry, Action unknown ! See ScriptFile for more info !"
  282. END /* SELECT */
  283. EXIT
  284.  
  285. /***************************************************************************************/
  286. /****************************** Environment routines ***********************************/
  287. /***************************************************************************************/
  288.  
  289. /*
  290. ** Set Compiler Title
  291. */
  292.  
  293. ShowCompilingInProgress:
  294.   LISTER SET handle LABEL "GCC ErrorList"
  295.   LISTER SET handle TITLE "GCC ErrorList -- Making ..."
  296.   LISTER SET handle HEADER "Wait for compiler to finish ..."
  297.   LISTER CLEAR handle
  298.   ErrMsg.display = 'ProjectDir: '||sPrjDirName
  299.   PopMenu.COUNT = 1
  300.   PopMenu.0 = "Sorry, you must wait for the compiler !"
  301.   ErrMsg.Menu = PopMenu
  302.   LISTER ADDSTEM handle ErrMsg
  303.   LISTER REFRESH handle FULL
  304. RETURN
  305.  
  306. /*
  307. ** ErrorHandling
  308. */
  309.  
  310. ERROR:
  311. FAILURE:
  312. HALT:
  313.   ADDRESS "DOPUS.1"
  314.   IF handle ~= 'handle' THEN 
  315.     LISTER SET handle BUSY OFF
  316. EXIT
  317.  
  318. /*
  319. ** Subroutine OpenErrConsole (Not yet working, obsolete)
  320. */
  321.  
  322. OpenErrConsole:
  323.   IF OPEN( ErrCon_Temp, "T:GCC_ERROR_ErrCon.REXX", 'write' ) THEN DO
  324.     WriteLn( ErrCon_Temp, '/* GCC_ERROR - ErrConsole.Rexx - Script */' );
  325.     WriteLn( ErrCon_Temp, 'IF Open( InFile, "'||ErrConName||'", "read" ) THEN DO' )
  326.     WriteLn( ErrCon_Temp, '  DO WHILE ~EOF( InFile )' );
  327.     WriteLn( ErrCon_Temp, '    InStr = ReadLn( InFile )' );
  328.     WriteLn( ErrCon_Temp, '    IF STRIP(InStr) = "@$~^SHUTDOWN^~$@" THEN' );
  329.     WriteLn( ErrCon_Temp, '      LEAVE' );
  330.     WriteLn( ErrCon_Temp, '    SAY InStr' );
  331.     WriteLn( ErrCon_Temp, '  END' );
  332.     WriteLn( ErrCon_Temp, 'END' );
  333.     WriteLn( ErrCon_Temp, 'ELSE' );
  334.     WriteLn( ErrCon_Temp, '  SAY "-- Can`t open '||ErrConName||' !!!"' );
  335.     Close( ErrCon_Temp )
  336.   END
  337.   ADDRESS 'COMMAND' 'RUN <>"CON:20/10/619/189/GNU DOpus MakeShell V0.01/CLOSE/WAIT" SYS:REXXC/RX T:GCC_ERROR_ErrCon.REXX'
  338. RETURN
  339.  
  340.  
  341. /*
  342. ** SubRoutine DoReMake
  343. */
  344.  
  345. DoReMake:
  346.   IF OPEN( Make_Temp, "T:GCC_ERROR_MAKE.TEMP", 'write' ) THEN DO
  347.                 IF ~SHOW('p','GCC_ERROR') THEN 
  348.     WriteLn( Make_Temp, "WaitForPort >NIL: <NIL: GCC_ERROR" )
  349.     WriteLn( Make_Temp, 'bin:Echo " GNU DOpus MakeShell V0.7\nCopyrigth (c) 1996/1997 by Emmy"' )
  350.     WriteLn( Make_Temp, 'bin:Echo ""' )
  351.     WriteLn( Make_Temp, 'CD '||sPrjDirName )
  352.     WriteLn( Make_Temp, 'DELETE >NIL: '||ErrFileName )
  353.     WriteLn( Make_Temp, 'ECHO "" >'||ErrFileName||' NOLINE' )
  354.     WriteLn( Make_Temp, 'C:Stack 1000000' )
  355.     WriteLn( Make_Temp, 'GNU:Bin/Make' )
  356.     WriteLn( Make_Temp, 'RUN >NIL: <NIL: SYS:REXXC/RX RAM:T/Gcc_Error.cache.dopus5.rexx REFRESH_ERRLIST '||ErrFileName )
  357.     /* WriteLn( Make_Temp, 'bin:echo "[RETURN]"' ) */
  358.     WriteLn( Make_Temp, 'bin:Echo "^"' );
  359.     WriteLn( Make_Temp, 'bin:Echo "|"' );
  360.     WriteLn( Make_Temp, 'bin:Echo -n "+-- Click to close"' )
  361.     WriteLn( Make_Temp, 'ENDCLI' )
  362.     Close( Make_Temp )
  363.   END
  364.   IF SHOW( 'p', 'GOLDED.1' ) THEN
  365.     ADDRESS 'GOLDED.1' 'SAVE ALL BUFFERS SMART'
  366.   ADDRESS 'COMMAND' 'RUN <>"CON:20/10/619/189/GNU DOpus MakeShell V0.7/CLOSE/WAIT/AUTO" C:EXECUTE T:GCC_ERROR_MAKE.TEMP'
  367.   /*'RUN <>'||ErrConName||' C:EXECUTE T:GCC_ERROR_MAKE.TEMP'*/
  368.   ADDRESS 'DOPUS.1'
  369. RETURN
  370.  
  371.  
  372. /*
  373. ** SubRoutine CacheThisScript
  374. */
  375.  
  376. CacheThisScript:
  377.   ADDRESS "COMMAND"
  378.   'COPY DOPUS5:AREXX/GCC_ERROR.DOPUS5 RAM:T/gcc_error.cache.dopus5.rexx QUIET'
  379. RETURN
  380.  
  381. /*
  382. ** CleanUP
  383. */
  384.  
  385. CleanUpFiles:
  386.   ADDRESS "COMMAND"
  387.   'DELETE >NIL: RAM:T/gcc_error.cache.dopus5.rexx QUIET'
  388.   'DELETE >NIL: RAM:T/GCC_ERROR_MAKE.TEMP QUIET'
  389.   'DELETE >NIL: RAM:T/GCC_ERROR_BREAK.TEMP QUIET'
  390.   'DELETE >NIL: '||ErrFileName||' QUIET'
  391.   'DELETE >NIL: "T:GCC_ERROR_ErrCon.REXX" QUIET'
  392. RETURN
  393.  
  394.  
  395. /***************************************************************************************/
  396. /******************************* Main Handle Routine ***********************************/
  397. /***************************************************************************************/
  398.  
  399. /*
  400. ** SubRoutine DoHandle
  401. **
  402. ** This is the "SERVER"-Main Routine
  403. */
  404.  
  405. DoHandle:
  406.   DO UNTIL Event = 'inactive'
  407.     IF WaitPkt( PortName ) THEN DO
  408.       Packet = GetPkt( PortName )
  409.  
  410.       IF Packet ~= '00000000'x THEN DO
  411.  
  412.         /* 
  413.         ** Get Data of the AREXX-Message 
  414.         */
  415.  
  416.         Event = GetArg(Packet,0)
  417.         /* Handle = GetArg(Packet,1) -- We don`t need this */
  418.         Namestr = GetArg(Packet,2)
  419.         User = GetArg(Packet,3)
  420.         Pathstr = GetArg(Packet,4)
  421.         Qualifier = GetArg(Packet,6)
  422.         Deststr = GetArg(Packet,7)
  423.         
  424.         /* 
  425.         ** Work with the Message 
  426.         */
  427.         sCmd = STRIP(SUBWORD( Event, 1, 1 ))
  428.  
  429.         SELECT
  430.  
  431.           /*
  432.           ** Special Privat CMD`s
  433.           */
  434.  
  435.           WHEN  sCmd = 'REFRESH_ERRLIST' THEN DO
  436.             /*
  437.             ** Refresh ErrorList
  438.             */
  439.  
  440.             ErrFileName = SUBWORD( Event, 2 )
  441.             CALL ReadErrFile
  442.           END
  443.  
  444.           WHEN sCmd = 'GO_NEXT_ERROR' THEN DO
  445.             nActErrNo = nActErrNo + 1
  446.             CALL GoToErrorNo nActErrNo
  447.           END
  448.  
  449.           WHEN sCmd = 'GO_FIRST_ERROR' THEN DO
  450.             nActErrNo = 1
  451.             CALL GoToErrorNo nActErrNo
  452.           END
  453.  
  454.           WHEN sCmd = 'DUMP_ENV' THEN DO
  455.             sMsg = 'ErrFile:'||ErrFileName||LF
  456.             sMsg = sMsg||'PrjDir:'||sPrjDirName
  457.             LISTER REQUEST handle sMsg 'Ok' 
  458.           END
  459.  
  460.  
  461.           WHEN sCmd = "BREAK_MAKE" THEN 
  462.             CALL Break_Make
  463.  
  464.           WHEN sCmd = "REMAKE_PROJECT" | sCmd = "REMAKE_PROJECT_NEWDIR" THEN DO
  465.             IF sCmd = "REMAKE_PROJECT_NEWDIR" THEN
  466.                  sPrjDirName = SUBWORD( Event, 2 )
  467.             CALL DoReMake
  468.         CALL ShowCompilingInProgress
  469.           END
  470.  
  471.           WHEN sCmd = "ABOUT" THEN DO
  472.             sAMsg = 'GCC-ErrorLister'||LF||'V0.7'||LF
  473.             sAMsg = sAMsg||'Copyrigth (c) 1996/1997 by Emmy'||LF||LF
  474.             sAMsg = sAMsg||'If you find this little script'||LF
  475.             sAMsg = sAMsg||'usefull, please send a email to:'||LF||LF
  476.             sAMsg = sAMsg||'es@mylius.com'||LF||LF
  477.             sAMsg = sAMsg||'You can of course also send '||LF||'suggestions and bugreports.'
  478.             LISTER REQUEST handle sAMsg 'Ok'
  479.           END
  480.  
  481.           
  482.           /*
  483.           ** DOpus support
  484.           */
  485.  
  486.           WHEN Event = 'doubleclick' THEN DO
  487.             IF bListFilled = 1 THEN DO 
  488.               IF Left( namestr, 1 ) = '"' THEN
  489.                 PARSE VAR namestr '"' namestr '"'
  490.               ErrNo = namestr
  491.               
  492.               SELECT
  493.                 WHEN ErrLst.ErrNo.EType = 1 THEN DO
  494.                   CALL GoToLine ErrLst.ErrNo.File ErrLst.ErrNo.LineNo ErrLst.ErrNo.Display
  495.                   nActErrNo = GetActErrNo( ErrNo )
  496.                 END
  497.                 OTHERWISE 
  498.                   NOP
  499.               END /* SELECT */
  500.             END /* IF */
  501.           END /* WHEN */
  502.  
  503.           WHEN Event = 'Delete' THEN DO
  504.             LISTER QUERY handle SELENTRIES
  505.             Entries = result
  506.             DO WHILE Entries ~= ''
  507.               PARSE VAR Entries '"' Entry '"' Entries
  508.               LISTER REMOVE handle Entry
  509.             END
  510.             LISTER REFRESH handle FULL
  511.           END
  512.           
  513.           /*
  514.           ** Everything else CMD`s
  515.           */
  516.  
  517.           WHEN POS(Event,Reject) > 0 THEN DO
  518.             LISTER SET handle HEADER "This is an ErrorListing and not a directory !!!"
  519.             LISTER REFRESH handle FULL
  520.           END
  521.  
  522.           OTHERWISE 
  523.             NOP
  524.         END
  525.  
  526.         /*
  527.         ** Replay the Message
  528.         */
  529.         CALL Reply(Packet,0)
  530.       END /* IF */
  531.     END /* IF */
  532.   END /* DO */
  533. RETURN
  534.  
  535.  
  536. /***************************************************************************************/
  537. /***************************** SubRoutines for PORT-Handling ***************************/
  538. /***************************************************************************************/
  539.  
  540. /*
  541. ** SubRoutine GoToErrorNo
  542. */
  543.  
  544. GoToErrorNo:
  545.   PARSE ARG nErrNo
  546.   nRealErrNo = 0
  547.   IF nErrNo ~= 0 THEN DO i = 1 TO MaxEntries
  548.     IF ErrLst.i.EType = 1 THEN DO
  549.       nErrNo = nErrNo - 1
  550.       IF nErrNo = 0 THEN DO
  551.         nRealErrNo = i
  552.         LEAVE
  553.       END
  554.     END
  555.   END
  556.   IF nRealErrNo ~= 0 THEN DO
  557.     /*
  558.     ** Give "visual feedback" before really going to the error
  559.     */
  560.     DO i = 1 TO MaxEntries
  561.       LISTER SELECT handle i OFF
  562.     END
  563.     LISTER SELECT handle nRealErrNo
  564.     LISTER REFRESH handle FULL
  565.     CALL GoToLine ErrLst.nRealErrNo.File ErrLst.nRealErrNo.LineNo ErrLst.nRealErrNo.Display
  566.   END
  567. RETURN
  568.  
  569.  
  570. /*
  571. ** SubRoutine GetActErrNo
  572. */
  573.  
  574. GetActErrNo:
  575.   PARSE ARG nRealErrNo
  576.   nActErrNo = 0
  577.   DO i = 1 TO nRealErrNo
  578.     IF ErrLst.i.EType = 1 THEN
  579.       nActErrNo = nActErrNo + 1
  580.   END
  581. RETURN nActErrNo
  582.  
  583.  
  584. /*
  585. ** SubRoutine GoToLine
  586. */
  587.  
  588. GoToLine:
  589.   PARSE ARG sGoToFile nGoToLine sGoToDisplay
  590.  
  591.   IF nGoToLine = 0 THEN
  592.     nGoToLine = 1
  593.  
  594.   /* 
  595.   ** Change the next lines, to fit your needs, if you not
  596.   ** use GoldED
  597.   */
  598.  
  599.   IF ~Show('p','GOLDED.1') THEN DO
  600.     ADDRESS "COMMAND" "RUN >NIL: <NIL: GoldED:GoldED"
  601.     ADDRESS "COMMAND" "WaitForPort GOLDED.1"
  602.   END
  603.  
  604.   ADDRESS 'GOLDED.1' 
  605.   'OPEN "'||sGoToFile||'" NEW SMART'
  606.   'GOTO LINE '||nGoToLine||' UNFOLD TRUE'
  607.  
  608.   /* 
  609.   ** Fix the string 
  610.   */
  611.  
  612.   HELPSTR = STRIP(sGoToDisplay)
  613.   /* GoldEd-Var fixing doesen`t work !?!?! -- So, we do it A ourself */
  614.   /* 'FIX VAR HELPSTR' */
  615.  
  616.   /*
  617.   ** Fix '*'
  618.   */
  619.   hstr = ''
  620.   nPos = POS( '*', Helpstr ) 
  621.   DO WHILE nPos > 0 
  622.     hstr = hstr || SUBSTR( HelpStr, 1, nPos ) || '*'
  623.     IF nPos < LENGTH( HelpStr ) THEN
  624.       HelpStr = SUBSTR( HelpStr, nPos + 1 )
  625.     ELSE
  626.       HelpStr = ''
  627.     nPos = POS( '*', HelpStr )
  628.   END
  629.   hstr = hstr||HelpStr
  630.  
  631.   /*
  632.   ** Fix '"'
  633.   */
  634.   hstr = ''
  635.   nPos = POS( '"', Helpstr ) 
  636.   DO WHILE nPos > 0 
  637.     hstr = hstr || SUBSTR( HelpStr, 1, nPos - 1 ) || '*"'
  638.     IF nPos < LENGTH( HelpStr ) THEN
  639.       HelpStr = SUBSTR( HelpStr, nPos + 1 )
  640.     ELSE
  641.       HelpStr = ''
  642.     nPos = POS( '"', HelpStr )
  643.   END
  644.   hstr = hstr||HelpStr
  645.  
  646.   'REQUEST STATUS="'||hstr||'" STAY'
  647.  
  648.   ADDRESS 'DOPUS.1' /* ReAddress DOpusPort */
  649. RETURN
  650.  
  651.  
  652. /*
  653. ** SubRoutine Break_Make
  654. ** Does not work (yet)
  655. */
  656. BREAK_MAKE:
  657.   ADDRESS 'COMMAND'
  658.   "STATUS >T:GCC_ERROR_BREAK.TMP"
  659.   IF BOpen( TmpFile, "T:GCC_ERROR_BREAK.TMP", 'READ', 100 ) THEN DO
  660.     bFileEmpty = 1
  661.     DO UNTIL BEOF( ErrFile )
  662.       helpstr = BReadLn( ErrFile )
  663.       IF helpstr ~= '' THEN DO
  664.         IF POS( "make", helpstr ) THEN 
  665.           'C:BREAK >NIL: '||COMPRESS(SUBWORD(helpstr,2,1),':')
  666.       END
  667.     END
  668.     CALL BClose( TmpFile )
  669.   END
  670.   ADDRESS 'DOPUS.1' /* ReAddress DOpusPort */
  671. RETURN
  672.  
  673.  
  674.  
  675.  
  676. /***************************************************************************************/
  677. /**************************** SubRoutines for Reading/Parsing **************************/
  678. /***************************************************************************************/
  679.  
  680. /*
  681. ** SubRoutine ReadErrFile
  682. */
  683.  
  684. ReadErrFile:
  685.   nErrs = 0
  686.   nWarns = 0
  687.   i = 0
  688.   MaxEntries = 0
  689.   bListFilled = 0
  690.   nActErrNo = 0
  691.   sActDirName = sPrjDirName
  692.   nSapd = 0
  693.   
  694.   ADDRESS "DOPUS.1"
  695.   LISTER SET handle TITLE 'Parsing GCC-ErrorFile ...'
  696.   LISTER SET handle HEADER 'This could take a while ...'
  697.   LISTER CLEAR handle
  698.   LISTER REFRESH handle FULL
  699.   LISTER SET handle BUSY ON
  700.  
  701.   IF BOpen( ErrFile, ErrFileName, 'READ', 100 ) THEN DO
  702.     bFileEmpty = 1
  703.     DO UNTIL BEOF( ErrFile )
  704.       helpstr = BReadLn( ErrFile )
  705.       IF helpstr ~= '' THEN DO
  706.         MaxEntries = i
  707.         CALL ParseLine helpstr
  708.         IF bIsErr = 1 THEN DO
  709.                                         i = i + 1
  710.                                         bFileEmpty = 0
  711.         END
  712.       END
  713.     END
  714.     IF bFileEmpty = 1 THEN DO
  715.       ErrMsg.display = 'Everything Ok ! -- No Errors and Warnings !'
  716.       PopMenu.COUNT = 1
  717.       PopMenu.0 = "All`s fine !"
  718.       ErrMsg.Menu = PopMenu
  719.       LISTER ADDSTEM handle ErrMsg
  720.     END
  721.     ELSE
  722.       CALL FillLister
  723.     CALL BClose( ErrFile )
  724.   END
  725.   ELSE DO
  726.  
  727.     /*
  728.     ** Give an ErrorMessage 
  729.     */
  730.  
  731.     ErrMsg.display = 'FATAL ERROR: ErrorFile "'||ErrFileName||'" can`t be opened !!!'
  732.     LISTER ADDSTEM handle ErrMsg
  733.   END
  734.  
  735.   /*
  736.   ** Redraw the list 
  737.   */
  738.  
  739.   LISTER SET handle TITLE "GCC ErrorList"
  740.   LISTER SET handle HEADER "Result: "||nErrs||" Errors "||nWarns||" Warnings"
  741.  
  742.   LISTER REFRESH handle FULL
  743.   LISTER SET handle BUSY OFF
  744. RETURN
  745.  
  746.  
  747. /******************************************************************************
  748. ** SubRoutine ParseLine
  749. ******************************************************************************/
  750.  
  751. ParseLine: 
  752.   PARSE ARG InLine
  753.   bIsErr = 1
  754.   ErrLst.i.TYPE = -1
  755.   ErrLst.i.File = ''
  756.   ErrLst.i.LineNo = 0
  757.   ErrLst.i.EType = 0
  758.   ErrLst.i.TypeName = "Information"
  759.   SELECT
  760.     WHEN SUBWORD( InLine, 1, 1 ) = 'In' THEN DO
  761.  
  762.       /* 
  763.       ** Error/Warning in an file Included from this file 
  764.       */
  765.  
  766.       ErrLst.i.DISPLAY = " "||InLine
  767.       ErrLst.i.TYPE = -1 
  768.       ErrLst.i.TypeName = "Error/Warning in includes file"
  769.     END
  770.     WHEN SUBWORD( InLine, 1, 1 ) = 'included' THEN  DO
  771.  
  772.       /* 
  773.       ** Error/Warning in an file Included from this file 
  774.       */
  775.  
  776.       ErrLst.i.DISPLAY = " "||InLine
  777.       ErrLst.i.TYPE = -1
  778.       ErrLst.i.TypeName = "Error/Warning in includes file"
  779.     END
  780.     WHEN SUBWORD( InLine, 1, 1 ) = '@SAPD%' THEN DO
  781.  
  782.       /* 
  783.       ** Set Active Project Dir (SAPD) 
  784.       */
  785.  
  786.       nSapd = nSapd + 1;
  787.       Sapd.nSapd = sActDirName
  788.       sActDirName = SUBWORD( InLine, 2 );
  789.       IF sActDirName = '~' THEN DO
  790.         nSapd = nSapd - 1
  791.         IF nSapd <= 0 THEN
  792.                                         sActDirName = sPrjDirName
  793.         ELSE
  794.           sActDirName = Sapd.nSapd
  795.         nSapd = nSapd - 1
  796.       END
  797.       bIsErr = 0;
  798.     END
  799.     OTHERWISE DO
  800.  
  801.       /* 
  802.       ** "Normal" Error-/Warning-Message 
  803.       */
  804.  
  805.       sFirstWord = SUBWORD( InLine, 1, 1 )
  806.       SELECT
  807.         WHEN SUBWORD( InLine, 2, 2 ) = "In method" | SUBWORD( InLine, 2, 2 ) = "In function" THEN DO
  808.           ErrLst.i.DISPLAY = SUBWORD( InLine, 2 )
  809.           ErrLst.i.TYPE = 1
  810.       ErrLst.i.TypeName = "Error/Warning in method/function"
  811.         END
  812.         WHEN (POS(".c:",sFirstWord) + POS(".cpp:",sFirstWord) + POS(".h:",sFirstWord) + POS(".texi",sFirstWord))> 0 THEN DO
  813.  
  814.           /*
  815.           ** Normal Errors/Warnings 
  816.           */
  817.  
  818.           IF SUBWORD( InLine, 2, 1 ) = "warning:" THEN  DO
  819.             ErrLst.i.DISPLAY = "  WARNING: "||SUBWORD( InLine, 3 )
  820.             nWarns = nWarns + 1
  821.             ErrLst.i.TYPE = 4
  822.         ErrLst.i.TypeName = "Warning"
  823.             
  824.             /* 
  825.             ** Get FileName and LineNumber
  826.             */
  827.  
  828.             sWord = SUBWORD( InLine, 1, 1 )
  829.             nPos = LASTPOS( ':', sWord )
  830.             IF nPos > 0 THEN
  831.               nPos = LASTPOS( ':', SUBSTR( InLine, 1, nPos - 1 ) )
  832.             IF nPos > 0 THEN DO
  833.               ErrLst.i.File  = TransFileName( SUBSTR( sWord, 1, nPos - 1 ), sActDirName )
  834.               nLastPos = LASTPOS( ':', sWord )
  835.               IF nLastPos > nPos THEN
  836.                 ErrLst.i.LineNo = CheckLineNo( SUBSTR( sWord, nPos + 1,  nLastPos - 1 - nPos ) )
  837.               ErrLst.i.EType = 1
  838.             END
  839.           END
  840.           ELSE  DO
  841.             ErrLst.i.DISPLAY = "  ERROR: "||SUBWORD( InLine, 2 )
  842.             ErrLst.i.TYPE = -4
  843.             nErrs = nErrs + 1
  844.         ErrLst.i.TypeName = "Error"
  845.  
  846.             /* 
  847.             ** Get FileName and LineNumber
  848.             */
  849.  
  850.             sWord = SUBWORD( InLine, 1, 1 )
  851.             nPos = LASTPOS( ':', sWord )
  852.             IF nPos > 0 THEN
  853.               nPos = LASTPOS( ':', SUBSTR( InLine, 1, nPos - 1 ) )
  854.             IF nPos > 0 THEN DO
  855.               ErrLst.i.File  = TransFileName( SUBSTR( sWord, 1, nPos - 1 ), sActDirName )
  856.               nLastPos = LASTPOS( ':', sWord )
  857.               IF nLastPos > nPos THEN
  858.                 ErrLst.i.LineNo = CheckLineNo( SUBSTR( sWord, nPos + 1,  nLastPos - 1 - nPos ) )
  859.               ErrLst.i.EType = 1
  860.             END
  861.           END
  862.         END
  863.         OTHERWISE DO
  864.           ErrLst.i.DISPLAY = SUBWORD( InLine, 2 )
  865.           ErrLst.i.TYPE = -4
  866.         END /* OTHERWISE */
  867.       END /* SELECT */
  868.     END /* OTHERWISE */
  869.   END /* SELECT */
  870. RETURN
  871.  
  872.  
  873. /*
  874. ** SubRoutine TransFileName
  875. ** Transform "../" to realname
  876. */
  877.  
  878. TransFileName:
  879.   PARSE ARG sFileName sDirName
  880.   IF sDirName = "" THEN
  881.     sDirName = sPrjDirName
  882.   sFileName = STRIP( sFileName )
  883.   IF SUBSTR( sFileName, 1, 4 ) = "..//" THEN 
  884.     sFileName = sDirName||SUBSTR( sFileName, 4 )
  885.   IF SUBSTR( sFileName, 1, 3 ) = "../" THEN 
  886.     sFileName = sDirName||SUBSTR( sFileName, 3 )
  887.   IF POS( '/', sFileName ) = 0 THEN
  888.     sFileName = sDirName||sFileName
  889.   sFileName = COMPRESS( sFileName, '"' )
  890.   IF SUBSTR(sFileName,1,1) = "/" THEN DO /* Transform /device/... to device: */
  891.     sFileName = SUBSTR(sFileName,2); /* Strip "/" */
  892.     nHelp = POS( "/", sFileName );
  893.     IF nHelp > 0 THEN
  894.       sFileName = SUBSTR( sFileName, 1, nHelp - 1 ) || ":" || SUBSTR( sFileName, nHelp + 1 )
  895.   END
  896. RETURN sFileName
  897.  
  898. /*
  899. ** SubRoutine CheckLineNo
  900. */
  901.  
  902. CheckLineNo:
  903.   PARSE ARG nLineNo
  904.   IF nLineNo = 0 THEN
  905.     nLineNo = 1
  906. RETURN nLineNo
  907.  
  908.  
  909. /*
  910. ** SubRoutine FillLister
  911. */
  912.  
  913. FillLister:
  914.   LISTER CLEAR handle
  915.   DO i = 0 TO MaxEntries
  916.     /* Entry.BASE = i */
  917.     Entry.TYPE = ErrLst.i.TYPE
  918.     Entry.Display = ErrLst.i.DISPLAY
  919.     Entry.Name = i
  920.     PopMenu.COUNT = 4
  921.     PopMenu.BASE = i
  922.     PopMenu.0 = ErrLst.i.TypeName
  923.     PopMenu.1 = "---"
  924.     PopMenu.2 = "File: "||RIGHT(ErrLst.i.File,30)
  925.     PopMenu.3 = "Line: "||ErrLst.i.LineNo
  926.     Entry.Menu = PopMenu
  927.     LISTER ADDSTEM handle Entry.
  928.   END
  929.   bListFilled = 1
  930. RETURN
  931.  
  932.  
  933.  
  934. /************************************************************************************
  935. ** Buffered AREXX-I/O
  936. ************************************************************************************/
  937.  
  938. BOpen:
  939.   PARSE ARG FileNum, FileName, FileMode, MaxCount
  940.   BFiles.FileNum.Buff = ""
  941.   BFiles.FileNum.WriteCount = 0
  942.   BFiles.FileNum.UnReadBuff. = ''
  943.   BFiles.FileNum.UnReadNum = 0
  944.   BFiles.FileNum.ReadBuff = ''
  945.   BFiles.FileNum.MaxCount = MaxCount
  946. RETURN Open( BFiles.FileNum.FH, FileName, FileMode )
  947.  
  948.  
  949. BClose:
  950.   PARSE ARG FileNum
  951.   CALL BFlush FileNum 
  952.         Close( BFiles.FileNum.FH )
  953.   BFiles.FileNum. = ''
  954. RETURN
  955.  
  956.  
  957. BFlush:
  958.   PARSE ARG FileName
  959.   IF BFiles.FileNum.Buff ~= '' THEN DO 
  960.                 BFiles.FileNum.WriteCount = BFiles.FileNum.MaxCount + 1
  961.                 CALL BWriteLn FileNum 
  962.   END
  963. RETURN
  964.  
  965.  
  966. BWrite:
  967.   PARSE ARG FileNum, Line
  968.  
  969.   /*
  970.   ** Add String to Buffer
  971.   */
  972.  
  973.   IF BFiles.FileNum.Buff ~== '' THEN
  974.     BFiles.FileNum.Buff = BFiles.FileNum.Buff||Line
  975.   ELSE
  976.     BFiles.FileNum.Buff = Line
  977. RETURN
  978.  
  979.  
  980. BWriteLn:
  981.   PARSE ARG FileNum, Line
  982.  
  983.   /*
  984.   ** Add String to Buffer
  985.   */
  986.  
  987.   IF BFiles.FileNum.Buff ~== '' THEN
  988.     BFiles.FileNum.Buff = BFiles.FileNum.Buff||'0a'x||Line
  989.   ELSE
  990.     BFiles.FileNum.Buff = Line
  991.  
  992.   /* 
  993.   ** Perhaps flush the buffer
  994.   */
  995.  
  996.   BFiles.FileNum.WriteCount = BFiles.FileNum.WriteCount + 1
  997.   IF BFiles.FileNum.WriteCount >= BFiles.FileNum.MaxCount THEN DO
  998.     WriteLn( BFiles.FileNum.FH, BFiles.FileNum.Buff )
  999.                 BFiles.FileNum.Buff = ""
  1000.                 BFiles.FileNum.WriteCount = 0
  1001.   END
  1002. RETURN
  1003.  
  1004.  
  1005. BReadLn: PROCEDURE EXPOSE BFiles.
  1006.   PARSE ARG FileNum
  1007.   sLine = ''
  1008.   IF BFiles.FileNum.UnReadNum > 0 THEN DO
  1009.     nUnReadNum = BFiles.FileNum.UnReadNum 
  1010.                 BFiles.FileNum.UnReadNum = nUnReadNum - 1
  1011.     RETURN BFiles.FileNum.UnReadBuff.nUnReadNum
  1012.   END
  1013.   IF BFiles.FileNum.ReadBuff = '' THEN
  1014.     BFiles.FileNum.ReadBuff = ReadCh( BFiles.FileNum.FH, 65534 );
  1015.   nPos = POS( '0a'x, BFiles.FileNum.ReadBuff )
  1016.   IF nPos ~= 0 THEN DO
  1017.     sLine = SUBSTR( BFiles.FileNum.ReadBuff, 1, nPos - 1 )
  1018.     BFiles.FileNum.ReadBuff = DELSTR( BFiles.FileNum.ReadBuff, 1, nPos )
  1019.   END
  1020.   ELSE DO
  1021.     sLine = BFiles.FileNum.ReadBuff
  1022.     IF sLine ~= '' THEN DO 
  1023.                         BFiles.FileNum.ReadBuff = ''
  1024.                         sPart2 = BReadLn( FileNum )
  1025.       sLine = sLine || sPart2
  1026.     END
  1027.   END
  1028. RETURN sLine
  1029.  
  1030.  
  1031. BUnReadLn:
  1032.   PARSE ARG FileNum, burln_sLine
  1033.         nUnReadNum = BFiles.FileNum.UnReadNum 
  1034.         nUnReadNum = nUnReadNum + 1
  1035.         BFiles.FileNum.UnReadBuff.nUnReadNum = burln_sLine
  1036.   BFiles.FileNum.UnReadNum = nUnReadNum 
  1037. RETURN
  1038.  
  1039.  
  1040. BEof:
  1041.   PARSE ARG FileNum
  1042.   IF BFiles.FileNum.ReadBuff ~= '' THEN
  1043.     RETURN 0
  1044.   IF BFiles.FileNum.UnReadNum = 0 THEN
  1045.                 RETURN Eof( BFiles.FileNum.FH )
  1046. RETURN 0
  1047.  
  1048. /* END OF FILE */
  1049.